package com.eastfair.auth.service;

import com.eastfair.auth.dto.UserAccountDto;
import com.eastfair.auth.dto.UserAccountSaveDTO;
import com.eastfair.auth.dto.UserUpdPassParam;
import com.eastfair.auth.vo.UserAccountVo;
import com.eastfair.boot.service.SuperCacheService;
import com.eastfair.auth.entity.UserAccount;
import com.eastfair.core.base.R;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 业务接口
 * 用户账户信息
 * </p>
 *
 * @author ligang
 * @date 2021-07-13
 */
public interface UserAccountService extends SuperCacheService<UserAccount> {
    /**
     * 查询用户信息
     *
     * @param userAccount 用户实体
     * @return
     */
    UserAccount getUser(UserAccount userAccount);

    /**
     * 注册
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> register(UserAccountDto userAccountDto);

    /**
     * 注册公司员工
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> registerOfCompany(UserAccountDto userAccountDto);


    /**
     * 登录
     *
     * @param userAccountDto 用户实体
     * @return
     */
    R<UserAccountVo> login(UserAccountDto userAccountDto);


    /**
     * 手机号登录
     *
     * @param userAccountDto 用户实体
     * @return
     */
    R<UserAccountVo> loginOfMobile(UserAccountDto userAccountDto);

    /**
     * 邮箱登录
     *
     * @param userAccount 用户实体
     * @return
     */
    R<UserAccountVo> loginOfEmail(UserAccountDto userAccountDto);

    /**
     * 登出
     *
     * @param userId 用户id
     * @return
     */
    R loginOut(Long userId);

    /**
     * 修改密码
     * @param userUpdPassParam 修改密码实体
     * @return
     */
    R<Boolean> updPassword(UserUpdPassParam userUpdPassParam);

    /**
     * 设置密码
     * @param userUpdPassParam 密码实体
     * @return
     */
    R<Boolean> setPassword(UserUpdPassParam userUpdPassParam);
    /**
     * 重置密码
     *
     * @param userId 用户id
     * @return
     */
    R<Boolean> initPassword(Long userId);

    /**
     * 成为展商，观众
     * @param userAccountDto
     * @return
     */
    R<UserAccountVo> initRole(UserAccountDto userAccountDto);


    /**
     * 查询用户信息
     *
     * @param userIds 用户id集合
     * @return
     */
    R<List<UserAccountVo>> findByIds(List<Long> userIds);

    /**
     * 查询用户信息
     *
     * @param userId 用户id
     * @return
     */
    R<UserAccountVo> findById(Long userId);


//    /**
//     * 查询用户角色
//     * @param userId
//     * @return
//     */
//    List<UserAccount> findRoleOfUserId(Long userId);

    /**
     * list查询用户信息
     *
     * @param userAccount 用户实体
     * @param ids 用户id集合
     * @return
     */
    List<UserAccount> listOfUserAccount(UserAccount userAccount, List<Long> ids);
    /**
     * list查询用户信息
     *
     * @param userAccount 用户实体
     * @param ids 用户id集合
     * @return
     */
    List<UserAccountVo> listOfUserAccountVo(UserAccount userAccount, List<Long> ids);

    /**
     * 查询用户所有角色和菜单
     *
     * @param userId 用户id
     * @return
     */
    UserAccountVo findOrgRoleOfUserId(Long userId);


    /**
     * 校验角色菜单是否超出本身的事件范围
     *
     * @param userId 用户id
     * @param menuIds 菜单id集合
     * @return
     */
    R verifyMenu(Long userId, List<Long> menuIds);

    /**
     * 校验角色事件是否超出本身的事件范围
     *
     * @param userId 用户id
     * @param functionIds 功能id集合
     * @return
     */
    R verifyFunction(Long userId, List<Long> functionIds);


    /**
     * 逻辑删除 sharding
     * @param ids
     * @return
     */
    R removeByIdsOfLogicOfSharding(List<Long> ids);

    /**
     * 修改用户
     * @param userAccountDto
     * @return
     */
    R<Boolean> updateById(UserAccountDto userAccountDto);


    /**
     * 修改公司用户
     * @param userAccountDto
     * @return
     */
    R<Boolean> updateByIdOfCompany(UserAccountDto userAccountDto);
    /**
     * 给其他项目创建管理员
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> addAdminUser(UserAccountDto userAccountDto);


    /**
     * 密码校验
     * @param password  明文密码
     * @param storePassword  数据库的储存密码
     * @return
     */
    boolean isValidPassword(String password, String storePassword);


    /**
     * 全库查询用户信息
     * @param userAccountDto
     * @return
     */
    List<UserAccount> getUserByNameAllDb(UserAccountDto userAccountDto);


    /**
     * 根据邮箱和手机号查询用户信息
     *
     * @param userAccountDto 用户实体
     * @return
     */
    List<UserAccount> listOfPhoneOrEmail(UserAccountDto userAccountDto);


}
